package yxy.game.pm2.module.godBeast;

import yxy.cherry.data.DataCenter;
import yxy.cherry.data.bean.equipdata;
import yxy.cherry.data.bean.equipforge;
import yxy.game.pm2.Result;
import yxy.game.pm2.bean.Currency;
import yxy.game.pm2.bean.GodBeastEquipPosition;
import yxy.game.pm2.bean.Item;
import yxy.game.pm2.bean.currency.CurrencyNotEnoughException;
import yxy.game.pm2.bean.currency.CurrencyType;
import yxy.game.pm2.message.PickedGodBeastMessage;

import javax.persistence.criteria.CriteriaBuilder;
import java.util.*;

/**
 * @author wrs
 * @description 神兽装备处理
 * @since 2022-07-28
 */
public class TherionEquipHandler {

    public static final int ATTACK = 1; //攻击
    public static final int LIFE = 2; //生命
    public static final int DEFENCE = 3; //防御

    /**
     * 获取神兽部位的强化属性值
     * @param godBeastEquip
     * @return
     */
    public static int getPositionAttributeValue(GodBeastEquip godBeastEquip) {
        int attributeValue = 0;
        if (godBeastEquip.getAttributetype() == ATTACK){
            attributeValue = godBeastEquip.getAttributenum1();
        }else if (godBeastEquip.getAttributetype() == DEFENCE){
            attributeValue = godBeastEquip.getAttributenum3();
        }else if (godBeastEquip.getAttributetype() == LIFE){
            attributeValue = godBeastEquip.getAttributenum2();
        }
        return attributeValue;
    }

    /**
     * 修改强化属性值
     * @param godBeastEquip 新装备
     * @param position 部位
     * @param attributeValue
     */
    public static void setAttributeValue(GodBeastEquip godBeastEquip, int position, int attributeValue) {
        if (position == ATTACK){
            godBeastEquip.setAttributenum1(attributeValue);
        }else if (position == DEFENCE){
            godBeastEquip.setAttributenum3(attributeValue);
        }else if (position == LIFE){
            godBeastEquip.setAttributenum2(attributeValue);
        }
    }

    /**
     * 工坊 神兽装备封装
     * @param therionEquips
     * @param response
     * @return
     */
    public Result packTherionEquips(ArrayList<Currency> therionEquips, PickedGodBeastMessage.TherionEquipmentInfoResponse.Builder response) {
        //玩家没有神兽装备
        if (therionEquips.size() == 0){
            response.addEquips(PickedGodBeastMessage.Equip.newBuilder());
            return Result.Success;
        }

        for (Currency equip : therionEquips) {
            if (equip.getNumber() > 0){
                //从表中获取 装备 属性数值
                equipdata equipdata = DataCenter.getData(equip.getDataId(), equipdata.class);

                PickedGodBeastMessage.Property.Builder equipPropertyBuilder = PickedGodBeastMessage.Property.newBuilder(); //装备属性
                if (equipdata.getAttributetype() == ATTACK){
                    equipPropertyBuilder.setAttack(equipdata.getAttributenum());
                }else if(equipdata.getAttributetype() == LIFE){
                    equipPropertyBuilder.setLife(equipdata.getAttributenum());
                }else if (equipdata.getAttributetype() == DEFENCE){
                    equipPropertyBuilder.setDefense(equipdata.getAttributenum());
                }

                PickedGodBeastMessage.Equip.Builder therionEquipBuilder = PickedGodBeastMessage.Equip.newBuilder(); //神兽装备
                therionEquipBuilder.setCode(equipdata.getId());//id
                therionEquipBuilder.setType(equipdata.getPosition()); //部位
                therionEquipBuilder.setLevel(equipdata.getQuality()); //品质，等级
                therionEquipBuilder.setStar(equipdata.getStar()); //星级
                therionEquipBuilder.setProperty(equipPropertyBuilder);//装备属性

                response.addEquips(therionEquipBuilder);
            }
        }
        return Result.Success;
    }

    /**
     * 封装 选择神兽装备槽信息
     * @param godBeast
     * @param equipPosition
     * @param response
     * @return
     */
    public Result packTherionEquipSlot(GodBeast godBeast, GodBeastEquipPosition equipPosition, PickedGodBeastMessage.TherionEquipmentUpgradeSelectResponse.Builder response) {

        GodBeastEquip godBeastEquip = godBeast.getGodBeastEquips(equipPosition); //神兽的装备槽

        if (godBeastEquip == null){
            return Result.DataError;
        }

        response.setStrengthenLevel(godBeastEquip.getStrengthenLevel());//初始的强化等级为零
        response.setExperience(godBeastEquip.getRemainExp()); //当前剩余经验值
        response.setTherionName(godBeast.getName()); //神兽名称

        //TODO 下一强化等级所需的经验值、攻防血增幅（查表）
        Map<String, equipforge> allData = DataCenter.getAllData(equipforge.class);
        for (equipforge equipforge : allData.values()) {
            if (equipforge.getTherion() == godBeast.getType()
                    && equipforge.getPosition() == godBeastEquip.getPosition()
                    && equipforge.getLevel() == godBeastEquip.getStrengthenLevel() + 1){
                response.setNextLevelExp(equipforge.getNeedexp()); //下一强化等级所需的经验值

                PickedGodBeastMessage.Property.Builder nextPropertyBuilder = PickedGodBeastMessage.Property.newBuilder();
                if (godBeastEquip.getAttributetype() == equipforge.getAttributetype()){

                    nextPropertyBuilder.setAttack(equipforge.getAttributenum());//攻击增幅

                }else if (godBeastEquip.getAttributetype() == equipforge.getAttributetype2()){

                    nextPropertyBuilder.setLife(equipforge.getAttributenum2());//生命增幅

                }else if (godBeastEquip.getAttributetype() == equipforge.getAttributetype3()){

                    nextPropertyBuilder.setDefense(equipforge.getAttributenum3());//防御增幅

                }
                response.setNextProperty(nextPropertyBuilder);//下一强化等级攻防血增幅
            }
        }

        //TODO 当前等级的攻防血增幅
        for (equipforge equipforge : allData.values()) {
            if (equipforge.getTherion() == godBeast.getType()
                    && equipforge.getPosition() == godBeastEquip.getPosition()
                    && equipforge.getLevel() == godBeastEquip.getStrengthenLevel()){
                PickedGodBeastMessage.Property.Builder currentPropertyBuilder = PickedGodBeastMessage.Property.newBuilder();
                if (godBeastEquip.getAttributetype() == ATTACK){
                    currentPropertyBuilder.setAttack(equipforge.getAttributenum());//攻击增幅
                }else if (godBeastEquip.getAttributetype() == LIFE){
                    currentPropertyBuilder.setLife(equipforge.getAttributenum2());//生命增幅
                }else if (godBeastEquip.getAttributetype() == DEFENCE){
                    currentPropertyBuilder.setDefense(equipforge.getAttributenum3());//防御增幅
                }
                response.setCurrentProperty(currentPropertyBuilder);
            }
        }


        return Result.Success;
    }

    /**
     * 各类装备的消耗数量，key：装备ID value：消耗数量
     * @param equipIds
     * @return
     */
    public Map<Integer, Integer> getConsumeEquipNum(List<Integer> equipIds) {
        HashMap<Integer, Integer> map = new HashMap<>();
        for (Integer equipId : equipIds) {
            if (!map.containsKey(equipId)){
                map.put(equipId,1);
            }else {
                Integer num = map.get(equipId);
                map.put(equipId, num + 1);
            }
        }
        return map;
    }


    /**
     * 消耗神兽装备，转换经验强化神兽部位
     * @param godBeast
     * @param equipPosition
     * @param consumeNumMap
     * @param playerCode
     * @return
     */
    public boolean consumeEquips(GodBeast godBeast, GodBeastEquipPosition equipPosition, Map<Integer, Integer> consumeNumMap, String playerCode) throws CurrencyNotEnoughException {
        //神兽强化部位
        GodBeastEquip therionEquip = godBeast.getGodBeastEquips(equipPosition);

        //todo 消耗选择的装备，根据表转化为对应的经验值
        Map<String, equipdata> allData = DataCenter.getAllData(equipdata.class);
        ArrayList<equipdata> allTherionEquips = getAllTherionEquips(allData.values());

        int totalExperience = 0; //消耗装备的总经验值
        for (Integer equipId : consumeNumMap.keySet()) {
            Integer equipNum = consumeNumMap.get(equipId);

            for (equipdata equipdata : allTherionEquips) {
                if (equipdata.getId() == equipId){
                    totalExperience += equipdata.getExperience() * equipNum;
                }
            }
        }
        //上次强化有剩余经验值的，加上
        if (therionEquip.getRemainExp() != 0){
            totalExperience += therionEquip.getRemainExp();
        }

        int upgradeExp = getUpgradeExp(godBeast, therionEquip);

        //todo 判断经验值值是否足够
        if (totalExperience < upgradeExp){
            return false;
        }

        //todo 消耗背包装备
        for (Integer equipId : consumeNumMap.keySet()) {
            Integer equipNum = consumeNumMap.get(equipId);
            Item.minus(playerCode, CurrencyType.CT_装备,equipId,equipNum);
        }

        //TODO 提升强化等级，足够就提升
        while (upgradeExp != 0 && totalExperience >= upgradeExp){
            //强化等级后剩余经验
            totalExperience = totalExperience - upgradeExp;
            therionEquip.setRemainExp(totalExperience);

            therionEquip.setStrengthenLevel(therionEquip.getStrengthenLevel()+1);

            //todo 修改攻防血增幅
            if (therionEquip.getAttributetype() == ATTACK){
                int oldValue = therionEquip.getAttributenum1();
                therionEquip.setAttributenum1(getAttributeNum(godBeast,therionEquip));//攻
                //修改神兽装备属性增幅
                therionEquip.setAttributenume(therionEquip.getAttributenum1() - oldValue + therionEquip.getAttributenume());
            }else if (therionEquip.getAttributetype() == DEFENCE){
                int oldValue = therionEquip.getAttributenum3();
                therionEquip.setAttributenum3(getAttributeNum(godBeast,therionEquip));//防
                //修改神兽装备属性增幅
                therionEquip.setAttributenume(therionEquip.getAttributenum3() - oldValue + therionEquip.getAttributenume());
            }else if (therionEquip.getAttributetype() == LIFE){
                int oldValue = therionEquip.getAttributenum2();
                therionEquip.setAttributenum2(getAttributeNum(godBeast,therionEquip));//血
                //修改神兽装备属性增幅
                therionEquip.setAttributenume(therionEquip.getAttributenum2() - oldValue + therionEquip.getAttributenume());
            }

            //下一级需要的经验值
            upgradeExp = getUpgradeExp(godBeast, therionEquip);
        }

        return true;
    }

    /**
     * 从表中读取神兽当前强化等级的增幅
     * @param godBeast
     * @param therionEquip
     * @return
     */
    private int getAttributeNum(GodBeast godBeast,GodBeastEquip therionEquip){
        Map<String, equipforge> allData = DataCenter.getAllData(equipforge.class);

        int attributeNum = 0;
        for (equipforge equipforge : allData.values()) {
            if (equipforge.getTherion() == godBeast.getType()
                    && equipforge.getPosition() == therionEquip.getPosition()
                    && therionEquip.getStrengthenLevel() == equipforge.getLevel()){

                if (therionEquip.getAttributetype() == ATTACK){
                    attributeNum = equipforge.getAttributenum(); //攻击
                }
                if (therionEquip.getAttributetype() == DEFENCE){
                    attributeNum = equipforge.getAttributenum3(); //防御
                }
                if (therionEquip.getAttributetype() == LIFE){
                    attributeNum = equipforge.getAttributenum2(); //生命
                }
            }
        }
        return attributeNum;
    }

    /**
     * 从表中读取神兽当前强化等级的增幅
     * @param godBeast
     * @param position
     * @param strengthenLevel
     * @return
     */
    public static int getAttributeNum(GodBeast godBeast,int position,int attributeType,int strengthenLevel){
        Map<String, equipforge> allData = DataCenter.getAllData(equipforge.class);

        int attributeNum = 0;
        for (equipforge equipforge : allData.values()) {
            if (equipforge.getTherion() == godBeast.getType()
                    && equipforge.getPosition() == position
                    && strengthenLevel == equipforge.getLevel()){

                if (attributeType == ATTACK){
                    attributeNum = equipforge.getAttributenum(); //攻击
                }else if (attributeType == DEFENCE){
                    attributeNum = equipforge.getAttributenum3(); //防御
                }else if (attributeType == LIFE){
                    attributeNum = equipforge.getAttributenum2(); //生命
                }
            }
        }
        return attributeNum;
    }

    /**
     * 在表中获取所有神兽的装备
     * @param allData
     * @return
     */
    private ArrayList<equipdata> getAllTherionEquips(Collection<equipdata> allData){
        ArrayList<equipdata> allTherionEquips = new ArrayList<>();
        for (equipdata equipdata : allData) {
            if (equipdata.getPosition() >= 11 && equipdata.getPosition() <= 13){
                allTherionEquips.add(equipdata);
            }
        }
        return allTherionEquips;
    }

    /**
     * 从表中获取下一强化等级所需的经验值
     * @param godBeast 神兽
     * @param therionEquip 神兽装备
     * @return
     */
    private int getUpgradeExp(GodBeast godBeast,GodBeastEquip therionEquip){
        Map<String, equipforge> allData = DataCenter.getAllData(equipforge.class);

        int upgradeExp = 0;
        for (equipforge equipforge : allData.values()) {
            if (equipforge.getTherion() == godBeast.getType()
                    && equipforge.getPosition() == therionEquip.getPosition()
                    && therionEquip.getStrengthenLevel() + 1 == equipforge.getLevel()){
                upgradeExp = equipforge.getNeedexp();
            }
        }
        return upgradeExp;
    }

    /**
     * 获取背包中神兽的装备
     * @param allEquips
     * @return
     */
    public ArrayList<Currency> getTherionEquipsInPackage(Collection<Currency> allEquips) {
        ArrayList<Currency> therionEquips = new ArrayList<>(); //拥有的神兽装备
        //过滤武将装备
        for (Currency equip : allEquips) {
            if (equip.getDataId() >= 100001 && equip.getDataId() <= 102010){
                for (long i = 0; i < equip.getNumber(); i++) {
                    therionEquips.add(equip);
                }
            }
        }
        return therionEquips;
    }

    /**
     * 封装神兽部位强化后信息
     * @param godBeast
     * @param equipPosition
     * @param therionEquips
     * @param response
     * @return
     */
    public Result packTherionEquipsAndNextLevelIncrease(GodBeast godBeast, GodBeastEquipPosition equipPosition, ArrayList<Currency> therionEquips, PickedGodBeastMessage.TherionEquipmentSmeltResponse.Builder response) {
        //神兽部位对象
        GodBeastEquip therionEquip = godBeast.getGodBeastEquips(equipPosition);

        response.setStrengthenLevel(therionEquip.getStrengthenLevel()); //当前强化等级

        //背包剩余神兽装备
        for (Currency equip : therionEquips) {
            if (equip.getNumber() > 0){
                //从表中获取 装备 属性数值
                equipdata equipdata = DataCenter.getData(equip.getDataId(), equipdata.class);

                PickedGodBeastMessage.Property.Builder equipPropertyBuilder = PickedGodBeastMessage.Property.newBuilder(); //装备属性
                if (equipdata.getAttributetype() == ATTACK){
                    equipPropertyBuilder.setAttack(equipdata.getAttributenum());
                }else if(equipdata.getAttributetype() == LIFE){
                    equipPropertyBuilder.setLife(equipdata.getAttributenum());
                }else if (equipdata.getAttributetype() == DEFENCE){
                    equipPropertyBuilder.setDefense(equipdata.getAttributenum());
                }

                PickedGodBeastMessage.Equip.Builder therionEquipBuilder = PickedGodBeastMessage.Equip.newBuilder(); //神兽装备
                therionEquipBuilder.setCode(equipdata.getId());//id
                therionEquipBuilder.setType(equipdata.getPosition()); //部位
                therionEquipBuilder.setLevel(equipdata.getQuality()); //品质，等级
                therionEquipBuilder.setStar(equipdata.getStar()); //星级
                therionEquipBuilder.setProperty(equipPropertyBuilder);//装备属性

                response.addEquips(therionEquipBuilder);
            }
        }

        response.setExperience(therionEquip.getRemainExp()); //强化后剩余的经验值

        //TODO 下一强化等级所需的经验值、攻防血增幅（查表）
        Map<String, equipforge> allData = DataCenter.getAllData(equipforge.class);
        for (equipforge equipforge : allData.values()) {
            if (equipforge.getTherion() == godBeast.getType()
                    && equipforge.getPosition() == therionEquip.getPosition()
                    && equipforge.getLevel() == therionEquip.getStrengthenLevel() + 1){
                response.setNextLevelExp(equipforge.getNeedexp()); //下一强化等级所需的经验值

                PickedGodBeastMessage.Property.Builder nextPropertyBuilder = PickedGodBeastMessage.Property.newBuilder();
                if (therionEquip.getAttributetype() == equipforge.getAttributetype()){

                    nextPropertyBuilder.setAttack(equipforge.getAttributenum());//攻击增幅

                }else if (therionEquip.getAttributetype() == equipforge.getAttributetype2()){

                    nextPropertyBuilder.setLife(equipforge.getAttributenum2());//生命增幅

                }else if (therionEquip.getAttributetype() == equipforge.getAttributetype3()){

                    nextPropertyBuilder.setDefense(equipforge.getAttributenum3());//防御增幅

                }
                response.setNextProperty(nextPropertyBuilder);//下一强化等级攻防血增幅
            }
        }

        //TODO 当前等级的攻防血增幅
        PickedGodBeastMessage.Property.Builder currentPropertyBuilder = PickedGodBeastMessage.Property.newBuilder();
        if (therionEquip.getAttributetype() == ATTACK){
            currentPropertyBuilder.setAttack(therionEquip.getAttributenum1());//攻击增幅
        }else if (therionEquip.getAttributetype() == LIFE){
            currentPropertyBuilder.setLife(therionEquip.getAttributenum2());//生命增幅
        }else if (therionEquip.getAttributetype() == DEFENCE){
            currentPropertyBuilder.setDefense(therionEquip.getAttributenum3());//防御增幅
        }
        response.setCurrentProperty(currentPropertyBuilder);


        return Result.Success;
    }

    /**
     * 判断装备等级是否满级
     * @param godBeast
     * @param equipPosition
     * @param equippos
     * @return
     */
    public boolean positionLevelIsUpper(GodBeast godBeast, GodBeastEquipPosition equipPosition,int equippos) {
        GodBeastEquip godBeastEquip = godBeast.getGodBeastEquips(equipPosition);

        Map<String, equipforge> allData = DataCenter.getAllData(equipforge.class);

        int positionMaxLevel = 0; //装备部位最高等级
        for (equipforge equipforge : allData.values()) {
            if (equipforge.getTherion() == godBeast.getType()
                    && equipforge.getPosition() == equippos && equipforge.getLevel() > positionMaxLevel){
                positionMaxLevel = equipforge.getLevel();
            }
        }

        return godBeastEquip.getStrengthenLevel() == positionMaxLevel;
    }
}
